#include <iostream>
#include <stdlib.h>
#include <queue>
#include <string>

using namespace std;

template <class T>
class Loopqueue
{
public:
    Loopqueue(int c=10);
    ~Loopqueue();
    bool isempty();
    int size();
    bool push(T t);
    bool pop();
    T front();

private:
    int capacity;
    int begin;
    int end;
    T* queue;
};

template<class T>
Loopqueue<T>::Loopqueue(int c=10):capacity(c),begin(0),end(0),queue(NULL)
{
    queue= new T[capacity];
};

template<class T>
Loopqueue<T>::~Loopqueue()
{
    delete[]queue;
}

template<class T>
bool Loopqueue<T>::isempty()
{
    if(begin==end)
        return true;
    else return false;
}

template<class T>
int Loopqueue<T>::size()
{
    return(end-begin+capacity)%capacity;
};


template<class T>
bool Loopqueue<T>::push(T t)
{
    if(end+1%capacity==begin)
    {
        return false;
    }
    queue[end]=t;
    end=(end+1)%capacity;
    return true;
};

template<class T>
bool Loopqueue<T>::pop()
{
    if(end==begin)
    {
        return false;
    }
    begin=(begin+1)% capacity;
    return true;
};

template <class T>
T Loopqueue<T>::front()
{
    if(end==begin)
    {
        return false;
    }
    return queue[begin];
};

int main()
{
    Loopqueue<string> queue(6);
    queue.push("one");
    queue.push("two");
    queue.push("three");
    queue.push("four");
    queue.push("five");
    cout<<"the length of queue"<<queue.size()<<endl;
    while(!queue.isempty())
    {
        cout<<queue.front()<<endl;
        queue.pop();
    }
    
    system("pause");
    return 0;
}
